package com.bob.like.constant;

import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.data.redis.core.script.RedisScript;

public class MQRedisLuaScriptConstant {

    /**
     * 点赞 Lua 脚本
     * KEYS[1]: 用户当日点赞计数键 (thumb:blog:user:{blogId}:{userId}:{date})
     * KEYS[2]: 点赞总数键 (thumb:sum:{blogId})
     * KEYS[3]: 最近点赞记录键 (thumb:blog:{blogId}:recent)
     * ARGV[1]: 当前时间戳（毫秒）
     * ARGV[2]: 当前用户ID
     * ARGV[3]: 今日最大点赞次数限制
     * 返回值:
     * -1: 已超过当日点赞上限
     *  1: 点赞成功
     */
    public static final RedisScript<Long> THUMB_SCRIPT = new DefaultRedisScript<>(
            """
            local count = redis.call('GET', KEYS[1])
        
            -- 检查是否超过当日点赞上限
            if count and tonumber(count) and tonumber(ARGV[3]) and tonumber(count) >= tonumber(ARGV[3]) then
                return -1
            end
        
            -- 增加点赞总数
            redis.call('INCR', KEYS[2])
        
            -- 更新用户当日点赞次数
            -- 设置过期时间为当天结束 + 1天
            local now = math.floor(tonumber(ARGV[1]) / 1000)
            local today_end = now - (now % 86400) + 86400
            local expire_seconds = today_end - now + 86400
            if not count then
                redis.call('SET', KEYS[1], 1)
                redis.call('EXPIRE', KEYS[1], expire_seconds)
            else
                redis.call('INCR', KEYS[1])
            end
            
        
            -- 添加到最近点赞 ZSet，并保留最多 100 条
            redis.call('ZADD', KEYS[3], ARGV[1], ARGV[2])
            redis.call('ZREMRANGEBYRANK', KEYS[3], 0, -101)
        
            return 1
            """, Long.class
    );
}
